package com.jiepos.mpos.core.util;

import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

 


/**
 * 
 * <p>标题: —— 日期处理工具类</p>
 * <p>模块: 通用平台</p>
 * <p>版权: Copyright (c) 2017 江苏杰博实信息技术有限公司
 * @author 娄伟峰
 * @version 1.0
 * @since 2017年9月11日 下午2:25:13
 * @history（历次修订内容、修订人、修订时间等）
 */
public class DateUtil {
	
	private static final Logger log = LoggerFactory.getLogger(DateUtil.class);
	
	public static final String FORMAT_LONG_TIME = "yyyy-MM-dd HH:mm:ss.SSS";
	public static final String FORMAT_TIME = "yyyy-MM-dd HH:mm:ss";
	public static final String FORMAT_DATE_1 = "yyyy-MM-dd";
	public static final String FORMAT_DATE_2 = "yyyy/MM/dd";
	public static final String FORMAT_DATE_3 = "yy-MM-dd";
	public static final String FORMAT_DATE_4 = "yy/MM/dd";
	public static final String FORMAT_DATE_CHINESE = "yyyy年MM月dd日";
	public static final String FORMAT_CHINESE = "yyyy年MM月dd日 HH时mm分ss秒";
	
	private DateUtil() {
		// null
	}
	
    /**
     * 定义常见的时间格式
     */
    private static String[] dateFormat =
    {
        "yyyy-MM-dd HH:mm:ss",
        "yyyy/MM/dd HH:mm:ss",
        "yyyy年MM月dd日HH时mm分ss秒",
        "yyyy-MM-dd",
        "yyyy/MM/dd",
        "yy-MM-dd",
        "yy/MM/dd",
        "yyyy年MM月dd日",
        "HH:mm:ss",
        "yyyyMMddHHmmss",
        "yyyyMMdd",
        "yyyy.MM.dd",
        "yy.MM.dd",
        "yyyyMM"
    };
	/**
	 * 获取当前季度
	 * @param nowmonth
	 * @return int
	 */
	public static int getQuarter(int nowmonth)
	{
		if(nowmonth>=1 && nowmonth<=3) {
			return 1;
		}else if(nowmonth>=4 && nowmonth<=6) {
			return 2;
		}else if(nowmonth>=7 && nowmonth<=9) {
			return 3;
		}else {
			return 4;
		}
	}
	
	/**
	 * 日期减天数计算结果
	 * 
	 * @param date SQL日期
	 * @param days 增加天数
	 * @return 返回结果
	 */
	public static String getDecreaseDaysDate(java.util.Date date,int days){
		long das = date.getTime() / (3600 * 24 * 1000) - days + 1;		
		return DateUtil.dateToStr(new Date(das*(3600 * 24 * 1000)));
	}
	
	/**
	 * 将日期类型转化为字符串，默认格式yyyy-MM-dd
	 * 
	 * @param date
	 * @return 返回结果
	 */
	public static String dateToStr(java.util.Date date) {
		if (date == null) {
			return null;
		}
		SimpleDateFormat newFormat = new SimpleDateFormat("yyyy-MM-dd");
		return newFormat.format(date);
	}

	/**
	 * 将日期类型转化为字符串,根据传入的格式输出日期（如YYYY年MM月DD日等）
	 * 
	 * @param date 日期
	 * @param sFormat 日期格式
	 * @return 返回结果
	 */
	public static String dateToStr(java.util.Date date, String sFormat) {
		if (date == null) {
			return null;
		}
		SimpleDateFormat newFormat = new SimpleDateFormat(sFormat);
		return newFormat.format(date);
	}

	/**
	 * 字符串转化为日期类型，默认格式yyyy-MM-dd
	 * 
	 * @param strDate 字符串
	 * @return 返回日期
	 */
	public static java.util.Date strToDate(String strDate) {
		if (StringUtils.isEmpty(strDate) || "".equals(strDate.trim())) {
			return null;
		}
		SimpleDateFormat newFormat = new SimpleDateFormat("yyyy-MM-dd");
		try {
			return newFormat.parse(strDate);
		} catch (ParseException ex) {
			return null;
		}
	}

	/**
	 * 将格式化的日期字串转化成日期类型(如yyyy年MM月DD日->date)
	 * 
	 * @param strDate 字符串
	 * @return 返回日期
	 */
	public static java.util.Date strToDate(String strDate, String sFormat) {
		if (StringUtils.isEmpty(strDate) || "".equals(strDate.trim())) {
			return null;
		}
		SimpleDateFormat newFormat = new SimpleDateFormat(sFormat);
		try {
			return newFormat.parse(strDate);
		} catch (ParseException ex) {
			return null;
		}
	}

	/**
	 * 将日期String转化成当前年龄(如1977年11月8日->25)
	 * 
	 * @param date 日期
	 * @return 返回结果
	 */
	public static String dateToAge(String date) {
		if (StringUtils.isEmpty(date) || "".equals(date.trim())) {
			return null;
		}
		String sReturn = "";
		try {
			java.util.Date dt = strToDate(date);
			String bMonDay = new SimpleDateFormat("MMdd").format(dt);
			String nMonDay = new SimpleDateFormat("MMdd").format(new Date());
			long l = Long.parseLong(nMonDay) - Long.parseLong(bMonDay);

			String sYear = date.trim().substring(0, 4);
			long lYear = Long.parseLong(sYear);
			SimpleDateFormat newFormat = new SimpleDateFormat("yyyy");
			long curYear = Long.parseLong(newFormat
					.format(new java.util.Date()));
			if (l < 0) {
				sReturn = String.valueOf(curYear - lYear - 1);
			} else {
				sReturn = String.valueOf(curYear - lYear);
			}

			return sReturn;
		} catch (Exception ex) {
			return null;
		}
	}

	/**
	 * 日期中本月月末的天
	 * 
	 * @param date 日期
	 * @return 返回结果
	 */
	public static int getMonthEndDay(java.util.Date date) {
		// 取 本月 月末的天
		if (date == null)
			return 0;
		int year = Integer.parseInt(date.toString().substring(0, 4));
		int month = Integer.parseInt(date.toString().substring(5, 7));
		Calendar cal = Calendar.getInstance();
		cal.set(Calendar.YEAR, year);
		cal.set(Calendar.MONDAY, month - 1);
		cal.set(Calendar.DATE, 1);
		return cal.getActualMaximum(Calendar.DAY_OF_MONTH);

	}

	/**
	 * 日期中本月月末的日期
	 * 
	 * @param date 日期
	 * @return 返回结果
	 */
	public static java.util.Date getMonthEnd(java.util.Date date)
			throws Exception {
		// 取 本月 月末
		if (date == null)
			return null;
		int year = Integer.parseInt(date.toString().substring(0, 4));
		int month = Integer.parseInt(date.toString().substring(5, 7));
		Calendar cal = Calendar.getInstance();
		cal.set(Calendar.YEAR, year);
		cal.set(Calendar.MONDAY, month - 1);
		cal.set(Calendar.DATE, getMonthEndDay(date));

		java.util.Date d = new java.util.Date(cal.getTime().getTime());
		return d;
	}

	/**
	 * 日期中本月月中的日期
	 * 
	 * @param date 日期
	 * @return 返回结果
	 */
	public static java.util.Date getMonthMid(java.util.Date date)
			throws Exception {
		// 取 本月 月中
		if (date == null)
			return null;
		int year = Integer.parseInt(date.toString().substring(0, 4));
		int month = Integer.parseInt(date.toString().substring(5, 7));
		Calendar cal = Calendar.getInstance();
		cal.set(Calendar.YEAR, year);
		cal.set(Calendar.MONDAY, month - 1);
		cal.set(Calendar.DATE, 15);

		java.util.Date d = new java.util.Date(cal.getTime().getTime());
		return d;

	}
	/**
	 * 获取当月最后一天
	 * @return
	 */
	public static String getMonthLastDay(){
		SimpleDateFormat datef=new SimpleDateFormat("yyyy-MM-dd");
		Calendar  cal = Calendar.getInstance(); 
	    cal.set( Calendar.DATE, 1 );
        cal.roll(Calendar.DATE, - 1 );
        Date endTime=cal.getTime();
        String endTime1=datef.format(endTime);
          return endTime1;
	}

	/**
	 * 日期中本月月初的日期
	 * 
	 * @param date 日期
	 * @return 返回结果
	 */
	public static java.util.Date getNextMonthFirst(java.util.Date date)
			throws Exception {
		// 取 次月 月初
		if (date == null)
			return null;
		int year = Integer.parseInt(date.toString().substring(0, 4));
		int month = Integer.parseInt(date.toString().substring(5, 7));

		if (month == 12) {
			year = year + 1;
			month = 1;
		} else
			month = month + 1;
		Calendar cal = Calendar.getInstance();
		cal.set(Calendar.YEAR, year);
		cal.set(Calendar.MONDAY, month - 1);
		cal.set(Calendar.DATE, 1);

		java.util.Date d = new java.util.Date(cal.getTime().getTime());
		return d;

	}

	/**
	 * 日期中上月月末的日期
	 * 
	 * @param date 日期
	 * @return 返回结果
	 */
	public static java.util.Date getPreviousMonthEnd(java.util.Date date)
			throws Exception {
		// 取 上一月末
		if (date == null)
			return null;
		int year = Integer.parseInt(date.toString().substring(0, 4));
		int month = Integer.parseInt(date.toString().substring(5, 7));

		if (month == 1) {
			year = year - 1;
			month = 12;
		} else
			month = month - 1;
		Calendar cal = Calendar.getInstance();
		cal.set(Calendar.YEAR, year);
		cal.set(Calendar.MONDAY, month - 1);
		cal.set(Calendar.DATE, 1);
		java.util.Date d = new java.util.Date(cal.getTime().getTime());
		cal.set(Calendar.DATE, getMonthEndDay(d));
		d = new java.util.Date(cal.getTime().getTime());
		return d;

	}

	/**
	 * 传入日期上一天的日期
	 * 
	 * @param date 日期
	 * @return 返回结果
	 */
	public static java.util.Date getPreviousDay(java.util.Date date)
			throws Exception {
		// 取 上一天
		if (date == null)
			return null;
		int year = Integer.parseInt(date.toString().substring(0, 4));
		int month = Integer.parseInt(date.toString().substring(5, 7));
		int day = Integer.parseInt(date.toString().substring(8, 10));
		if (day == 1) {
			if (month == 1) {
				year = year - 1;
				month = 12;
				day = 31;
			} else {
				month = month - 1;
				Calendar c = Calendar.getInstance();
				c.set(Calendar.YEAR, year);
				c.set(Calendar.MONTH, month - 1);
				c.set(Calendar.DATE, 1);
				java.util.Date d = new java.util.Date(c.getTime().getTime());
				day = getMonthEndDay(d);
			}
		} else
			day = day - 1;
		Calendar c = Calendar.getInstance();
		c.set(Calendar.YEAR, year);
		c.set(Calendar.MONTH, month - 1);
		c.set(Calendar.DATE, day);
		java.util.Date d = new java.util.Date(c.getTime().getTime());
		// 可以这样 d = java.util.Date.valueOf("2004-01-01");
		return d;
	}
	/**
	 * 获取当前日期的前一天
	 * @return
	 */
	public static String getPreDate(){
		Calendar calendar = Calendar.getInstance();//此时打印它获取的是系统当前时间
        calendar.add(Calendar.DATE, -1);    //得到前一天
        String  yestedayDate = new SimpleDateFormat("yyyy-MM-dd").format(calendar.getTime());
        return yestedayDate;
	}

	/**
	 * 传入日期下一天的日期
	 * 
	 * @param date 日期
	 * @return 返回结果
	 */
	public static java.util.Date getNextDay(java.util.Date date) throws Exception {
		// 取 下一天
		if (date == null)
			return null;
		int year = Integer.parseInt(date.toString().substring(0, 4));
		int month = Integer.parseInt(date.toString().substring(5, 7));
		int day = Integer.parseInt(date.toString().substring(8, 10));

		if (day == getMonthEndDay(date)) {
			if (month == 12) {
				year = year + 1;
				month = 1;
			} else
				month = month + 1;
			day = 1;
		} else
			day = day + 1;
		Calendar c = Calendar.getInstance();
		c.set(Calendar.YEAR, year);
		c.set(Calendar.MONTH, month - 1);
		c.set(Calendar.DATE, day);
		java.util.Date d = new java.util.Date(c.getTime().getTime());

		return d;
	}

	/**
	 * 获得日期的下一个星期一的日期
	 * 
	 * @param date 日期
	 * @return java.util.Date
	 */
	public static java.util.Date getNextMonday(java.util.Date date) {
		Calendar d1 = Calendar.getInstance();
		d1.setTime(date);
		java.util.Date result = date;
		do {
			d1 = (Calendar) d1.clone();
			d1.add(Calendar.DATE, 1);
		} while (d1.get(Calendar.DAY_OF_WEEK) != 2);
		
		result = new java.util.Date(d1.getTime().getTime());
		return result;
	}
	
	
	/**
	 * 日期加天数计算结果
	 * 
	 * @param date SQL日期
	 * @param days 增加天数
	 * @return 返回结果
	 */
	public static String getAddDaysDate(java.util.Date date,int days){
		long das = date.getTime() / (3600 * 24 * 1000) + days + 1;
		
		return dateToStr(new Date(das*(3600 * 24 * 1000)));
	}
	
	/**
	 * 计算日期加天数后的日期
	 * 
	 * @param date 日期
	 * @param days 增加天数
	 * @return 返回结果
	 */
	public static String getAddDaysDate(String date,int days){
		Date d = strToDate(date);
		long das = d.getTime() / (3600 * 24 * 1000) + days + 1;
		
		return dateToStr(new Date(das*(3600 * 24 * 1000)));
	}
	
	/**
	 * 获取当前第几周
	 * @param date
	 * @return
	 */
	public static int getNowWeek(java.util.Date date){
		GregorianCalendar g = new GregorianCalendar();  
		g.setTime(date);  
		return g.get(Calendar.WEEK_OF_YEAR);//获得周数  
	}
	/**
	 * 获取一周的起始日期
	 * 
	 * @param year
	 * @param week
	 * @return
	 */
	public static String getStartDateByWeek(int year, int week){
		Calendar cal=new GregorianCalendar();
        cal.set(Calendar.YEAR, year);
        cal.set(Calendar.WEEK_OF_YEAR, week);
        cal.set(Calendar.DAY_OF_WEEK, 1);
        Date result=cal.getTime();
 
        return new SimpleDateFormat("yyyy-MM-dd").format(result);
    }
	/**
	 * 获取一周的结束日期
	 * @param year
	 * @param week
	 * @return
	 */
	public static String getEndDateByWeek(int year, int week){
		Calendar cal=new GregorianCalendar();
        cal.set(Calendar.YEAR, year);
        cal.set(Calendar.WEEK_OF_YEAR, week);
        cal.set(Calendar.DAY_OF_WEEK, 7);
        Date result=cal.getTime();
    
        return new SimpleDateFormat("yyyy-MM-dd").format(result);
    }
	/**
	 * 计算日期加天数后的日期
	 * 
	 * @param date 日期
	 * @param days 增加天数
	 * @return 返回结果
	 */
	public static String getAddDaysDateFormat(String date,int days){
		Date d = toDate(date, "yyyy-MM-dd");
		long das = d.getTime() / (3600 * 24 * 1000) + days + 1;
		
		return toStringTrim(new Date(das*(3600 * 24 * 1000)),"yyyy-MM-dd");
	}
	
	
	/**
	 * 两个日期进行计算相差天数
	 * 
	 * @param sd 开始日期
	 * @param ed 结束日期
	 * @return long 返回结果
	 */
	public static long getXcDays(java.util.Date sd, java.util.Date ed) {
		return (ed.getTime() - sd.getTime()) / (3600 * 24 * 1000);
	}

	/**
	 * 计算传入两个日期相差月数，同月返回0
	 * 月数，同月返回0
	 * 
	 * @param mind 开始日期
	 * @param maxd 结束日期
	 * @return int 返回结果
	 */
	public static int getXcyf(java.util.Date mind, java.util.Date maxd) {
		// 月份 相差 同月为 0
		int year = Integer.parseInt(maxd.toString().substring(0, 4));
		int month = Integer.parseInt(maxd.toString().substring(5, 7));
		int year1 = Integer.parseInt(mind.toString().substring(0, 4));
		int month1 = Integer.parseInt(mind.toString().substring(5, 7));
		int xc = (year - year1) * 12 + (month - month1);
		if (xc < 0)
			xc = 0;
		return xc;
	}
	
	/**
	 * 计算2个日期之间的工作日(去除周六、日)天数
	 * 
	 * @param sd 开始日期
	 * @param ed 结束日期
	 * @return int
	 */
	public static int getWorkingDays(java.util.Date sd, java.util.Date ed) {
		Calendar d1 = Calendar.getInstance();
		Calendar d2 = Calendar.getInstance();
		d1.setTime(sd);
		d2.setTime(ed);
		
		int result = -1;
		if (d1.after(d2)) { // swap dates so that d1 is start and d2 is end
			java.util.Calendar swap = d1;
			d1 = d2;
			d2 = swap;
		}

		int charge_start_date = 0;// 开始日期的日期偏移量
		int charge_end_date = 0;// 结束日期的日期偏移量
		// 日期不在同一个日期内
		int stmp;
		int etmp;
		stmp = 7 - d1.get(Calendar.DAY_OF_WEEK);
		etmp = 7 - d2.get(Calendar.DAY_OF_WEEK);

		if (stmp != 0 && stmp != 6) {
			// 开始日期为星期六和星期日时偏移量为0
			charge_start_date = stmp;
		}
		if (etmp != 0 && etmp != 6) {
			// 结束日期为星期六和星期日时偏移量为0
			charge_end_date = etmp - 1;
		}
		result = (((int)DateUtil.getXcDays(getNextMonday(sd), getNextMonday(ed)) + 1) / 7) 
					* 5 + charge_start_date - charge_end_date;
		return result;
	}
	
	/**
	 * 计算2个日期之间的休息日(周六、日)天数
	 * 
	 * @param sd 开始日期
	 * @param ed 结束日期
	 * @return int
	 */
	public static int getHolidays(java.util.Date sd, java.util.Date ed) {
		return (int)DateUtil.getXcDays(sd, ed) + 1 - getWorkingDays(sd, ed);

	}

	/**
	 * 格式化日期，返回SQL日期
	 * 
	 * @param nd 年份
	 * @param mm 月份
	 * @param dd 日期
	 * @return java.util.Date 返回结果
	 */
	public static java.util.Date formatStrDate(String nd, String mm, String dd)
			throws Exception {
		java.util.Date fmtrq = null;
		Calendar cal = Calendar.getInstance();
		cal.set(Calendar.YEAR, Integer.parseInt(nd));
		cal.set(Calendar.MONTH, Integer.parseInt(mm));
		cal.set(Calendar.MONTH, Integer.parseInt(mm) - 1);
		if (dd != null && dd.equals("00"))
			cal.set(Calendar.MONTH, Integer.parseInt(mm));
		// //00 就是取下个月第一天
		cal.set(Calendar.DATE, Integer.parseInt(dd));
		fmtrq = new java.util.Date(cal.getTime().getTime());
		if (dd != null && dd.equals("00"))
			fmtrq = getNextDay(fmtrq);
		return fmtrq;
	}

	/**
	 * 获取当前日期，并返回java.util.Date数据类型
	 * 
	 * @return 返回java.util.Date数据类型
	 */
	public static java.util.Date getNowSqlDate() {
		java.util.Date cd = null;
		try {
			Date d = new Date();
			cd = new java.util.Date(d.getTime());
		} catch (Exception e) {
		}
		return cd;
	}

	/**
	 * 获得当前的日期 格式如“2002-10-22 "
	 * 
	 * @return String
	 */
	public static String getNowDate() {
		Date today = new Date();
		String snow, syear, smonth, sday;
		syear = String.valueOf(getYear(today));
		smonth = String.valueOf(getMonth(today));
		sday = String.valueOf(getDay(today));
		if (smonth.length() < 2)
			smonth = "0" + smonth;
		if (sday.length() < 2)
			sday = "0" + sday;
		snow = syear + "-" + smonth + "-" + sday;
		return snow;
	}

	/**
	 * 获得当前的日期和时间 格式如“2002-10-22 19:22:12”
	 * 
	 * @return String
	 */
	public static String getNowDateTime() {
		Date today = new Date();
		String snow, syear, smonth, sday;
		syear = String.valueOf(getYear(today));
		smonth = String.valueOf(getMonth(today));
		sday = String.valueOf(getDay(today));
		if (smonth.length() < 2) {
			smonth = "0" + smonth;
		}
		if (sday.length() < 2) {
			sday = "0" + sday;
		}
		String h = String.valueOf(getNowHour());
		String m = String.valueOf(getNowMinute());
		String s = String.valueOf(getNowSecond());
		if (h.length() < 2) {
			h = "0" + h;
		}
		if (m.length() < 2) {
			m = "0" + m;
		}
		if (s.length() < 2) {
			s = "0" + s;

		}
		snow = syear + "-" + smonth + "-" + sday + " " + h + ":" + m + ":" + s;
		return snow;
	}

	/**
	 * 获取当前时间
	 * 
	 * @return String 时间
	 */
	public static String getNowTime() {
		String time = "";
		String h = String.valueOf(getNowHour());
		String m = String.valueOf(getNowMinute());
		String s = String.valueOf(getNowSecond());
		if (h.length() < 2) {
			h = "0" + h;
		}
		if (m.length() < 2) {
			m = "0" + m;
		}
		if (s.length() < 2) {
			s = "0" + s;
		}
		time = h + ":" + m;
		return time;
	}

	/**
	 * 取得当天所在的年
	 * 
	 * @return String
	 */
	public static String getNowYear() {
		Date today = new Date();
		SimpleDateFormat sd = new SimpleDateFormat("yyyy");
		String syear = sd.format(today);
		return syear;
	}

	/**
	 * 取得当天所在的月份
	 * 
	 * @return String
	 */
	public static String getNowMonth() {
		Date today = new Date();
		SimpleDateFormat sd = new SimpleDateFormat("MM");
		String smon = sd.format(today);
		return smon;
	}
	
	/**
	 * 取得当天所在的月份 保证是两位字符
	 * 
	 * @return String
	 */
	public static String getNowMonth_2() {
		Date today = new Date();
		SimpleDateFormat sd = new SimpleDateFormat("MM");
		String smon = sd.format(today);
		return ((smon.length() == 1) ? ("0" + smon) : smon);
	}

	/**
	 * 取得当天的日
	 * 
	 * @return String
	 */
	public static String getNowDay() {
		Date today = new Date();
		SimpleDateFormat sd = new SimpleDateFormat("dd");
		String sday = sd.format(today);
		return sday;
	}
	
	/**
	 * 取得当天的日 保证是两位字符
	 * 
	 * @return String
	 */
	public static String getNowDay_2() {
		Date today = new Date();
		SimpleDateFormat sd = new SimpleDateFormat("dd");
		String sday = sd.format(today);
		return ((sday.length() == 1) ? ("0" + sday) : sday);
	}
//
	/**
	 * 获得当前的时
	 * 
	 * @return int
	 */
	public static int getNowHour() {
		Calendar now_Time = Calendar.getInstance();
		int hour = now_Time.get(Calendar.HOUR_OF_DAY);
		return hour;
	}

	/**
	 * 获得当前的分
	 * 
	 * @return int
	 */
	public static int getNowMinute() {
		Calendar now_Time = Calendar.getInstance();
		int minute = now_Time.get(Calendar.MINUTE);
		return minute;
	}

	/**
	 * 获得当前的秒
	 * 
	 * @return int
	 */
	public static int getNowSecond() {
		Calendar now_Time = Calendar.getInstance();
		int second = now_Time.get(Calendar.SECOND);
		return second;
	}

	/**
	 * 获得当前的完全的日期时间
	 * 
	 * @return String 日期字符串
	 */
	public static String getNowLongTime() {
		Date today = new Date();
		String snow, syear, smonth, sday, shour, sminute, ssecond;
		syear = String.valueOf(getYear(today));
		smonth = String.valueOf(getMonth(today));
		sday = String.valueOf(getDay(today));
		shour = String.valueOf(getNowHour());
		sminute = String.valueOf(getNowMinute());
		ssecond = String.valueOf(getNowSecond());
		if (smonth.length() < 2)
			smonth = "0" + smonth;
		if (sday.length() < 2)
			sday = "0" + sday;
		if (shour.length() < 2)
			shour = "0" + shour;
		if (sminute.length() < 2)
			sminute = "0" + sminute;
		if (ssecond.length() < 2)
			ssecond = "0" + ssecond;
		snow = syear + "-" + smonth + "-" + sday + " " + shour + ":" + sminute + ":" + ssecond;
		return snow;
	}

	/**
	 * 将String格式转换为java.util.Date 
	 * 
	 * @param DateString 日期字符串
	 * @return java.util.Date SQL日期
	 */
	public static java.util.Date getDate(String DateString) {
		java.util.Date cd = null;
		try {
			if (DateString == null || DateString.trim().equals(""))
				return null;

			if (DateString.length() >= 10) {
				cd = strToDate(DateString.substring(0, 10));
				return cd;
			}
			if (IsDate(DateString)) {
				cd = strToDate(DateString);
				return cd;
			}
			return null;
		} catch (Exception e) {
			return null;
		}
	}

	/**
	 * 取得该日期的年
	 * 
	 * @param  mdate 日期
	 * @return int
	 */
	public static int getYear(java.util.Date mdate) {
		SimpleDateFormat sd = new SimpleDateFormat("yyyy");
		String syear = sd.format(mdate);
		return Integer.parseInt(syear);
	}

	/**
	 * 取得该字符串的年
	 * 
	 * @param mdate 日期形字符串，如“2002-10-11” "2002-9-2"
	 * @return int
	 */
	public static int getYear(String mdate) {
		String syear = mdate.substring(0, 4);
		return Integer.parseInt(syear);
	}

	/**
	 * 取得该日期的月
	 * 
	 * @param mdate 日期形字符串，如“2002-10-11” "2002-9-2"
	 * @return int
	 */
	public static int getMonth(java.util.Date mdate) {
		SimpleDateFormat sm = new SimpleDateFormat("MM");
		String smon = sm.format(mdate);
		return Integer.parseInt(smon);
	}

	/**
	 * 取得该字符串的月
	 * 
	 * @param mdate 日期形字符串
	 * @return int
	 */
	public static int getMonth(String mdate) {
		String smon1, smon2;
		StringBuffer smon = new StringBuffer();
		smon1 = mdate.substring(5, 6);
		smon2 = mdate.substring(6, 7);
		if (smon2.equals("-")) {
			smon.append(smon1);
		} else {
			smon.append(smon1);
			smon.append(smon2);
		}
		return Integer.parseInt(smon.toString());
	}

	/**
	 * 取得该日期的天
	 * 
	 * @param mdate 日期
	 * @return int
	 */
	public static int getDay(java.util.Date mdate) {

		SimpleDateFormat sd = new SimpleDateFormat("dd");
		String sday = sd.format(mdate);
		return Integer.parseInt(sday);
	}

	/**
	 * 取得该字符串的天
	 * 
	 * @param mdate 日期形字符串，如“2002-10-11” "2002-9-2"
	 * @return int
	 */
	public static int getDay(String mdate) {
		int i = 0, j;
		int l = mdate.length();
		String s = "", sday1, sday2;
		StringBuffer sday = new StringBuffer();
		for (j = 0; j < 2; j++, s = "") {
			while (!(s.equals("-"))) {
				s = mdate.substring(i, i + 1);
				i++;
			}
		}
		sday1 = mdate.substring(i, i + 1);
		sday.append(sday1);
		if (!(i == l - 1)) {
			sday2 = mdate.substring(i + 1, i + 2);
			sday.append(sday2);
		}
		return Integer.parseInt(sday.toString());
	}

	

	/**
	 * 获得当前年-月最大天数
	 * 
	 * @param year 年度
	 * @param month 月份
	 * @return int 
	 */

	public static int getMonMDay(int year, int month) {
		if ((month == 1) || (month == 3) || (month == 5) || (month == 7)
				|| (month == 8) || (month == 10) || (month == 12)) {
			return 31;
		} else {
			if (month != 2) {
				return 30;
			} else {
				if (ifLeap(year)) {
					return 29;
				} else {
					return 28;
				}
			}
		}

	}

	
	/**
	 * 
需要注意的是：月份是从0开始的，比如说如果输入5的话，实际上显示的是4月份的最后一天，千万不要搞错了哦
	 * @param year
	 *            int 年份
	 * @param month
	 *            int 月份
	 * 
	 * @return int 某年某月的最后一天
	 */
	public static int getLastDayOfMonth(int year, int month) {
		Calendar cal = Calendar.getInstance();
		cal.set(Calendar.YEAR, year);
		cal.set(Calendar.MONTH, month);
		// 某年某月的最后一天
		return cal.getActualMaximum(Calendar.DATE);
	}


	
	/**
	 * 获得当前年-月最大天数
	 * 
	 * @param year 年度
	 * @param month 月份
	 * @return int
	 */
	public static int getMonMDay(String year, String month) {
		int year_int, month_int;
		year_int = Integer.parseInt(year);
		month_int = Integer.parseInt(month);
		int d = getMonMDay(year_int, month_int);
		return d;
	}
	
	/**
	 * 如果是闰年，返回true 否则返回false
	 * 
	 * @param year 传入的年份
	 * @return boolean 返回结果
	 */
	public static boolean ifLeap(int year) {
		if (!(year % 4 == 0)) {
			return false;
		} else {
			if (year % 100 != 0) {
				return true;
			} else {
				if (year % 400 == 0) {
					return true;
				} else {
					return false;
				}
			}
		}
	}

	/**
	 * 判断是否日期类型，如果是日期类型，返回true else 返回false
	 * 
	 * @param mdate 字符串
	 * @return boolean
	 */
	public static boolean IsDate(String mdate) {
		String s;
		int syear_int, smon_int, sday_int;
		int k, m = mdate.indexOf("-");
		if (m == -1) {
			return false;
		} else {
			s = mdate.substring(0, m);
			try {
				k = Integer.parseInt(s);
			} catch (NumberFormatException e) {
				return false;
			}
			if (k > 1900) {
				syear_int = getYear(mdate);
			} else {
				return false;
			}
		}

		if (syear_int < 9999) {
			smon_int = getMonth(mdate);

			if ((smon_int > 0) && (smon_int < 13)) {
				sday_int = getDay(mdate);
				if ((sday_int > 0) && (sday_int < 32)) {
					return true;
				} else {
					return false;
				}
			} else {
				return false;
			}
		} else {
			return false;
		}
	}

	/**
	 * 两个日期进行比较
	 * 
	 * @param rq1 日期
	 * @param rq2 日期
	 * @return 如果rq1小于rq2,返回-1;rq1等于rq2,返回0;rq1大于rq2,返回1;
	 */
	public static int compareDate(Date rq1, Date rq2) {
		int flag = 0;
		try {
			flag = rq1.compareTo(rq2);
		} catch (Exception e) {
		}
		return flag;
	}

	/**
	 * 将日期转化为大写中文格式，如：86年零壹月
	 * 
	 * @param d 日期
	 * @return String
	 */
	public static String getBigCnDate(String d) throws Exception {
		// 取得 大写 日期 eg.03年零贰月
		String dx = "";
		String hj[] = d.split("-");
		String year = hj[0];
		String month = hj[1];
		dx = year.substring(2) + "年" + getBigCn(month) + "月";
		return dx;
	}

	/**
	 * 将月份数字转换为大写中文
	 * 
	 * @param input 数字
	 * @return String
	 */
	private static String getBigCn(String input) {
		// 转换 大写 自己用
		String s1 = "零壹贰叁肆伍陆柒捌玖";
		String temp = "";
		String result = "";
		temp = input.trim();
		int len = 0;
		if (temp.indexOf(".") == -1)
			len = temp.length();
		else
			len = temp.indexOf(".");
		int n1 = 0;
		String num = "";

		for (int i = 0; i < temp.length(); i++) {
			if (i > len + 2) {
				break;
			}
			if (i == len) {
				continue;
			}
			n1 = Integer.parseInt(String.valueOf(temp.charAt(i)));
			num = s1.substring(n1, n1 + 1);
			n1 = len - i + 2;
			result = result.concat(num);
			if (result.equals("壹"))
				result = result.concat("拾");
		}

		return result;
	}
	
	/**
	 * 转化为中文格式日期型字符串“2002-10-11”
	 * 
	 * @param mdate 日期
	 * @return String
	 */
	public static String getCnNumDate(java.util.Date mdate) {
		String syear = String.valueOf(getYear(mdate));
		String smon = String.valueOf(getMonth(mdate));
		String sday = String.valueOf(getDay(mdate));
		String cndate = syear + "年" + smon + "月" + sday + "日";
		return cndate;
	}

	/**
	 * 转化为中文格式日期型字符串“2002-10-11”
	 * 
	 * @param mdate 日期
	 * @return String
	 */
	public static String getCnNumDate(String mdate) {
		String cndate, syear, smonth, sday;
		syear = String.valueOf(getYear(mdate));
		smonth = String.valueOf(getMonth(mdate));
		sday = String.valueOf(getDay(mdate));
		cndate = syear + "年" + smonth + "月" + sday + "日";
		return cndate;
	}
	
	/**
	 * 获得日期是星期几
	 * 
	 * @param date 日期
	 * @return String
	 */
	public static String getChineseWeek(java.util.Date date) {
		Calendar d1 = Calendar.getInstance();
		d1.setTime(date);
		final String dayNames[] = { "星期日", "星期一", "星期二", "星期三", "星期四", "星期五",
				"星期六" };
		int dayOfWeek = d1.get(Calendar.DAY_OF_WEEK);

		return dayNames[dayOfWeek - 1];

	}
	
	
	/**
	 * 获得日期是星期几(1代表周日,2代表周一)
	 * 
	 * @param date 日期
	 * @return String
	 */
	public static int getWeek(java.util.Date date) {
		Calendar d1 = Calendar.getInstance();
		d1.setTime(date);	 
		int dayOfWeek = d1.get(Calendar.DAY_OF_WEEK);

		return dayOfWeek;

	}
	
	
	/**
	 * 字符转日期,字符串格式："yyyy-MM-dd"，例如2006-01-01
	 * @param dateStr
	 * @return
	 */
	public static Date StringToDate(String dateStr){
		if (dateStr == null || dateStr.trim().length() == 0){
			return null;
		}
		return parseDate(dateStr, 3);
	}	

    /**
     * 解析一个字符串，形成一个Calendar对象，适应各种不同的日期表示法
     * @param dateStr 期望解析的字符串，注意，不能传null进去，否则出错
     * @return 返回解析后的Calendar对象
     * <br>
     * <br>可输入的日期字串格式如下：
     * <br>"yyyy-MM-dd HH:mm:ss",
     * <br>"yyyy/MM/dd HH:mm:ss",
     * <br>"yyyy年MM月dd日HH时mm分ss秒",
     * <br>"yyyy-MM-dd",
     * <br>"yyyy/MM/dd",
     * <br>"yy-MM-dd",
     * <br>"yy/MM/dd",
     * <br>"yyyy年MM月dd日",
     * <br>"HH:mm:ss",
     * <br>"yyyyMMddHHmmss",
     * <br>"yyyyMMdd",
     * <br>"yyyy.MM.dd",
     * <br>"yy.MM.dd"
     */
    public  static Calendar parseDate(String dateStr){
        if(dateStr == null || dateStr.trim().length()==0)
            return null;

        Date result = parseDate(dateStr,0);
        Calendar cal = Calendar.getInstance();
        cal.setTime(result);

        return cal;
    }
    /**
     * 解析一个字符串，形成一个Calendar对象，适应各种不同的日期表示法,从0开始
     * @param dateStr 期望解析的字符串，注意，不能传null进去，否则出错
     * @return 返回解析后的Calendar对象
     * <br>
     * <br>可输入的日期字串格式如下：
     * <br>"yyyy-MM-dd HH:mm:ss",
     * <br>"yyyy/MM/dd HH:mm:ss",
     * <br>"yyyy年MM月dd日HH时mm分ss秒",
     * <br>"yyyy-MM-dd",
     * <br>"yyyy/MM/dd",
     * <br>"yy-MM-dd",
     * <br>"yy/MM/dd",
     * <br>"yyyy年MM月dd日",
     * <br>"HH:mm:ss",
     * <br>"yyyyMMddHHmmss",
     * <br>"yyyyMMdd",
     * <br>"yyyy.MM.dd",
     * <br>"yy.MM.dd"
     */
    public  static Calendar parseFormatDate(String dateStr,int index){
        if(dateStr == null || dateStr.trim().length()==0)
           return null;

        Date result = parseDate(dateStr,index);
        Calendar cal = Calendar.getInstance();
        cal.setTime(result);

        return cal;
    }
    
    

    /**
     * 将一个日期转成日期时间格式，格式这样  2002-08-05 21:25:21
     * @param date  期望格式化的日期对象
     * @return 返回格式化后的字符串
     * <br>
     * <br>例：
     * <br>调用：
     * <br>Calendar date = new GregorianCalendar();
     * <br>String ret = DateUtils.toDateTimeStr(date);
     * <br>返回：
     * <br> ret = "2002-12-04 09:13:16";
     */
    public  static String toDateTimeStr(Calendar date){
        if(date == null)
            return null;
        return new SimpleDateFormat(dateFormat[0]).format(date.getTime());
    }
    
    /**
     * 内部方法，根据某个索引中的日期格式解析日期
     * @param dateStr 期望解析的字符串
     * @param index 日期格式的索引
     * @return 返回解析结果
     */
    public  static Date parseDate(String dateStr,int index){
        DateFormat df = null;
        try{
            df = new SimpleDateFormat(dateFormat[index]);

            return df.parse(dateStr);
        }catch(ParseException pe){
            return parseDate(dateStr,index+1);
        }catch(ArrayIndexOutOfBoundsException aioe){
             return null;
        }
    }
	
	/**
	 * 获取当前时间 格式： "yyyy-MM-dd HH:mm:ss.SSS"
	 */
	public static String getCurrTime() {
    	SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");
    	return sdf.format(new Date());
	}
	
	/**
	 * 获取当前日期 格式: yyyy-MM-dd
	 * @return
	 */
	public static String getCurrDate() {
		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
    	return sdf.format(new Date());
	}
	/**
	 * 获取当前日期 格式: yyyyMMdd
	 * @return
	 */
	public static String getCurrDateStr() {
		SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
    	return sdf.format(new Date());
	}
	
	/**
	 * 获取当前日期 格式: HHmmss
	 * @return
	 */
	public static String getCurrTimeStr() {
		SimpleDateFormat sdf = new SimpleDateFormat("HHmmss");
    	return sdf.format(new Date());
	}
	/**
	 * 获取当前日期 格式: HHmmssSSS
	 * @return
	 */
	public static String getCurrTimeMillisStr() {
		SimpleDateFormat sdf = new SimpleDateFormat("HHmmssSSS");
    	return sdf.format(new Date());
	}
	/**
	 * 获取当前日期 格式: yyyyMMddHHmmss
	 * @return
	 */
	public static String getCurrDateTimeStr() {
		SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmss");
    	return sdf.format(new Date());
	}
	
	/**
	 * 获取当前年份 ：1999
	 * @return
	 */
	public static int getCurrYear() {
		return GregorianCalendar.getInstance().get(Calendar.YEAR);
	}
	
	/**
	 * 获取当前月份：1,2,3,4 ... 12
	 * @return
	 */
	public static int getCurrMonth() {
		return GregorianCalendar.getInstance().get(Calendar.MONTH)+1;
	}
	
	/**
	 * 获取在月份中的当前日：1,2,3,4 ... 31
	 * @return
	 */
	public static int getCurrDay() {
		return GregorianCalendar.getInstance().get(Calendar.DAY_OF_MONTH);
	}
	
	/**
	 * 将日期转换为默认格式字符串 "yyyy-MM-dd HH:mm:ss"
	 * 和 toString()对应
	 * @param date
	 * @return
	 */
	public static java.util.Date toDate(String strDate) {
    	java.util.Date date = new Date();
    	SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    	try {
			date = sdf.parse(strDate);
		} catch (ParseException e) {
			log.debug("string to date error", e);
		}
    	return date;
	}
	
	/**
	 * 将字符串转换为默认格式日期 "yyyy-MM-dd HH:mm:ss"
	 * 和 toDate()对应
	 * @param strDate
	 * @return
	 */
	public static String toString(java.util.Date date) {
		if (date == null) {
			return "";
		}
		String rs = date.toString();
    	SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    	rs = sdf.format(date);
    	return rs;
	}
    
    /**
     * 将日期转换为指定格式字符串
     * @param date
     * @param format 格式  如： yyyy-MM-dd 
     * @return
     */
    public static String toString(java.util.Date date, String format) {
    	if (date == null || format == null) {
			return "";
		}
    	String rs = date.toString();
    	SimpleDateFormat sdf = new SimpleDateFormat(format);
    	rs = sdf.format(date);
    	return rs;
    }
    
    /**
     * 将字符串按指定格式转换为日期
     * @param strDate
     * @param format
     * @return
     */
    public static java.util.Date toDate(String strDate, String format) {
    	java.util.Date date = new Date();
    	SimpleDateFormat sdf = new SimpleDateFormat(format);
    	try {
			date = sdf.parse(strDate);
		} catch (ParseException e) {
			log.debug("string to date error", e);
		}
    	return date;
    }
    
    /**
     * 将日期转换为指定格式字符串(去除前面的0)
     * @param date
     * @param format 格式  如： 2009-09-12转换成2009-9-12 
     * @return 转换后的日期
     */
    public static String toStringTrim(java.util.Date date, String format) {
    	String rs = date.toString();
    	SimpleDateFormat sdf = new SimpleDateFormat(format);
    	rs = sdf.format(date);
    	String str[] = rs.split("-");
    	String s = str[0] + "-" + StringUtils.parseInt(str[1]) + "-" + StringUtils.parseInt(str[2]);
    	return s;
    }
    /**
     * 日期加月份
     * @param ymd 日期
     * @param amount 月份
     * @return
     */
    public static String addMonths(String ymd, int amount) {
        final Calendar calendar = new GregorianCalendar();
        calendar.setLenient(true);
       
        calendar.set(Integer.parseInt(ymd.substring(0, 4)),
                Integer.parseInt(ymd.substring(5, 7)),
                Integer.parseInt(ymd.substring(8)));
        int month = Calendar.MONTH;
        calendar.add(month, amount);

        final SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
        sdf.setLenient(false);
        return sdf.format(calendar.getTime());
    }
    
//    public static java.util.Date getCurrDate() {
//    	SimpleDateFormat newFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
//    }
    
    public static void main(String[] args) throws ParseException {
    /*	SimpleDateFormat newFormat = new SimpleDateFormat("yyyy-MM-dd HH");
		System.out.println(newFormat.parse("2008-09-11 12:13:12.012"));
		System.out.println(newFormat.format(newFormat.parse("2008-09-11 12:13:12.012")));*/
/*    	SimpleDateFormat newFormat = new SimpleDateFormat("yyyy-MM-dd HH",new Locale("US"));
    	String date1 = "Thu Jul 16 11:43:55 CST 2009";
		Calendar cal = Calendar.getInstance();
   // 	java.util.Date da = new java.util.Date();
		java.util.Date d = new java.util.Date(cal.getTime().getTime());
		
    	System.out.println("d=="+newFormat.format(date1));
*/
    /*	SimpleDateFormat newFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
     	System.out.println("new date === "+DateUtil.toDate("2008-09-11 12:13:12.012","yyyy-MM-dd HH:mm:ss"));
   //   	System.out.println("new date === "+newFormat.parse("2008-09-11 12:13:12"));
    	System.out.println(DateUtil.getCurrDay());
    	System.out.println(DateUtil.getCurrMonth());
    	System.out.println(DateUtil.getCurrYear());*/
    	/*String week = getDecreaseDaysDate(new Date(),30);
    	System.out.println(week);*/
  
    	
/*    	 String parseDate = "20150825195057";
         SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmss");
         SimpleDateFormat sdf2 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
         try {
             Date date = sdf.parse(parseDate);
             
             System.out.println(sdf2.format(date));   //输出结果2015-08-25 19:50:57
         } catch (ParseException e) {
             e.printStackTrace();
         }*/
    	
    /*	Calendar cal = DateUtil.parseFormatDate("20150810010101", 1);
		java.util.Date d = new java.util.Date(cal.getTime().getTime());
    	System.out.println("d=="+DateUtil.toString(d,DateUtil.FORMAT_TIME));*/
         
    /*	System.out.println(DateUtil.getCurrTimeMillisStr());
    	System.out.println( DateUtil.getCurrTimeMillisStr().substring(6));*/
//    	String str = "20170614";
//     	System.out.println(strToDate(str));
//    	Calendar cal = DateUtil.parseFormatDate("20170614", 10);
//		java.util.Date d = new java.util.Date(cal.getTime().getTime());
//		
//		System.out.println(d);
    	System.out.println(getLastMonth(null));
    }
    
 
    /**
    * 字符串转换成日期
    * @param str
    * @return date
    */
    public static Date StrToDate(String str) {
      
       SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
       Date date = null;
       try {
        date = format.parse(str);
       } catch (ParseException e) {
        e.printStackTrace();
       }
       return date;
    }
    /**
	 * 计算日期加天数后的日期
	 * 
	 * @param date 日期
	 * @param days 增加天数
	 * @return 返回结果
	 */
	public static String getAddDaysStrDate(String date,int days){
		Date d = strToDate(date,"yyyyMMdd");
		long das = d.getTime() / (3600 * 24 * 1000) + days + 1;
		
		return dateToStr(new Date(das*(3600 * 24 * 1000)));
	}
	
	
  /**
    *获取当前时间之前或之后几分钟 minute
    */
	public static String getTimeByMinute(int minute) {
        Calendar calendar = Calendar.getInstance();
        calendar.add(Calendar.MINUTE, minute);
        return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(calendar.getTime());

    }
	
	/**
	 * 获取指定日期格式的当月第一天
	 * @param foramt 日期格式，默认是yyyyMMdd
	 * @return
	 */
	public static String getCurrentMonthFirstDay(String foramt){
		Calendar calendar = Calendar.getInstance();
		calendar.set(Calendar.DAY_OF_MONTH, 1);
		if(StringUtils.isBlank(foramt)){
			foramt = dateFormat[10];
		}
		return dateToStr(calendar.getTime(), foramt);
	}
	
	/**
	 * 获取指定日期格式的上月第一天
	 * @param foramt 日期格式，默认是yyyyMMdd
	 * @return
	 */
	public static String getLastMonthFirstDay(String foramt){
		Calendar calendar = Calendar.getInstance();
		calendar.set(Calendar.DAY_OF_MONTH, 1);
		calendar.add(Calendar.MONTH, -1);
		if(StringUtils.isBlank(foramt)){
			foramt = dateFormat[10];
		}
		return dateToStr(calendar.getTime(), foramt);
	}
	
	/**
	 * 获取指定日期格式的上个月
	 * @param foramt 日期格式，默认是yyyyMM
	 * @return
	 */
	public static String getLastMonth(String foramt){
		Calendar calendar = Calendar.getInstance();
		calendar.add(Calendar.MONTH, -1);
		if(StringUtils.isBlank(foramt)){
			foramt = dateFormat[13];
		}
		return dateToStr(calendar.getTime(), foramt);
	}

}
